
#闭包的应用
#闭包可以携带函数环境，所以可以利用这一特征避免大量使用全局变量，下面就是一个应用的示例：
'''
模拟一个问题：计算用户累计量sum，初始sum= 0,以后每天增加不定新用户数num，每次新增用户后可以查看新的用户总数sum
'''

#1.使用非闭包方法来解决
sum = 0
def count(num):
    global sum 
    newSum = sum + num #代码1
    sum = newSum   #代码2
    return sum

print(count(2))
print(count(4))
print(count(6))

#此例报错：local variable 'sum' referenced before assignment；
#分析代码：这是因为定义count函数的时候，代码2中的sum出现在等号左边，Python会将其视为局部变量而不会再在外部寻找sum变量，
#而在代码执行时，由于代码1在代码2之前，代码1中的sum找不到定义，所以报错
#解决方法：在代码1前添加： global sum

print("\n-----------------优美的分割线--------------")

#2.使用闭包解决
sum1 = 0
def factory(current):
    def count(num):
        nonlocal current
        newCount = current + num
        current = newCount
        return newCount
    return count

func = factory(sum1)
print(func(2))
print(func(4))
print(func(6))
print(sum1)   #打印出0，其实sum并没有被用到
